//public class StringTest {
//    @Test
//    public void test1() throws NoSuchFieldException {
//        // 常量池中的字符串对象
//        String s1 = "hello";
//
//        // 堆中的字符串对象
//        String s2 = new String("hello");
//
//        // 检查引用是否相同
//        System.out.println(s1 == s2); // 输出 false，引用不同
//
//        // 检查内容是否相同
//        System.out.println(s1.equals(s2)); // 输出 true，内容相同
//
//        // 使用反射获取 String 类中的 value 字段
//        char[] value1 = null;
//        char[] value2 = null;
//        try {
//            Field valueField = String.class.getDeclaredField("value");
//            valueField.setAccessible(true);
//
//            // 获取 s1 和 s2 的 value 数组引用
//            value1 = (char[]) valueField.get(s1);
//            value2 = (char[]) valueField.get(s2);
//        } catch (IllegalAccessException e) {
//            throw new RuntimeException(e);
//        }
//
//        // 检查两个 value 数组是否是同一个引用
//        System.out.println(value1 == value2); // 输出 false，表明它们的 value 数组不同
//    }
//}

//public class StringTest {
//    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
//        String str = "Hello, World!";
//
//        // 使用反射访问 String 类的 `value` 字段
//        Field valueField = String.class.getDeclaredField("value");
//        valueField.setAccessible(true);
//
//        // 获取字符串的 byte 数组
//        byte[] byteArray = (byte[]) valueField.get(str);
//
//        // 输出 byte 数组的内存地址，证明是在堆区
//        System.out.println("Byte array memory address: " + System.identityHashCode(byteArray));
//        System.out.println("Byte array length: " + byteArray.length);
//    }
//}


import org.junit.Test;

public class StringTest {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();

        System.out.println("Used memory before: " + (runtime.totalMemory() - runtime.freeMemory()));

        for (int i = 0; i < 100000; i++) {
            String str = new String("String " + i);
            byte[] bytes = str.getBytes(); // 获取字符串的 byte[]
        }

        System.out.println("Used memory after: " + (runtime.totalMemory() - runtime.freeMemory()));
    }

    @Test
    public void test1() {
        // 初始设置
        final int CIRCLE_SIZE = 100_000; // 循环十万次
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");

        // 开始对比
        startTime = System.currentTimeMillis();
        for (int i = 0; i < CIRCLE_SIZE; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间：" + (endTime - startTime) + "ms");

        startTime = System.currentTimeMillis();
        for (int i = 0; i < CIRCLE_SIZE; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间：" + (endTime - startTime) + "ms");

        startTime = System.currentTimeMillis();
        for (int i = 0; i < CIRCLE_SIZE; i++) {
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间：" + (endTime - startTime) + "ms");
    }

    @Test
    public void test2() {
        final String prefix = "Hello";
        final String suffix = "World";

        String test = "Hello" + "World";
        test = prefix + "World";
        test = "Hello" + suffix;

        String anotherSuffix = "Java";
        String newString = test + "and" + anotherSuffix;
        System.out.println(newString);
    }
}